<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // ES6 引入了一种新的原始数据类型 Symbol ，表示独一无二的值，最大的用法是用来定义对象的唯一属性名。
      // const zks = Symbol("zks");
      // console.log(zks);
      // console.log(zks === Symbol("zks"));

      // //   这个一般是用户使用别人的库自己添加的
      // const fruit = {
      //   fname: "pear",
      //   age: 28,
      // };
      // const fname = Symbol();

      // fruit[fname] = "苹果";
      // console.log(fruit, fruit[fname], fruit.fname);

      // symbol初体验  这个是用于编写库的:作用是防止用户把自己定义的变量替换掉
      // const Symbol = {
      //   iteractor: Symbol("Symbol.iteractor"),
      // };

      let keys = {
        name: Symbol("name"),
        age: Symbol("age"),
        address: Symbol("address"),
        test: Symbol("test"),
        ZKS: Symbol("Symbol.iteractor"),
      };

      const user = {
        [keys.name]: "zks",
        [keys.age]: 18,
        [keys.address]: "beijing",
        [keys.ZKS]: function value() {
          console.log("symbol迭代器的使用");
        },
        [keys.test]() {
          console.log("symbol函数的使用");
        },
      };
      // Object.prototype[symbol.iteractor]=function values(){
      //   console.log(222);
      // }

      console.log(user, "user");
      user.name = "针织开衫";

      //   user[keys.test]()
      // user[keys.iteractor]();
      user[keys.ZKS]();

      // !遍历symbol
      // 遍历含有symbol的对象时，会遍历不出
      for (const i in user) {
        if (user.hasOwnProperty(i)) {
          console.log(i, "自有属性");
        }
      }
      console.log(Object.getOwnPropertySymbols(user), "symbol自有属性");
      // 新方法 暂时没学
      console.log(Reflect.ownKeys(user));

      //symbol的其他方法
      console.log(keys.name.description);

      // // Symbol.for  s2的创建是会在全局寻找有没有symbol.for的方法 如果有再去比较里面的参数是否相同 相同就直接引用不同则创建新的
      // let s1 = Symbol.for('foo');
      // let s2 = Symbol.for('foo')
      // console.log(s1 === s2);true

      // // Symbol.keyFor 返回参数信息
      // console.log(Symbol.keyFor(s1));

      // // 应用
      // const game = {
      //     sg: '1',
      //     cg: '2',
      //     sp: '3'
      // }

      // function role(type) {
      //     if (type === game.sg) {
      //         console.log(1);
      //     } else if (type === game.cg) {
      //         console.log(2);
      //     } else if (type === game.sp) {
      //         console.log(3);
      //     }
      // }

      // role('1');
      // ole('4');

     
    </script>
  </body>
</html>
